home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / ldpcx04 / ldpcx04s.lzh / LDPCX8.S < prev    next >
Text File  |  1997-06-10  |  25KB  |  1,256 lines

  1. *****************************************************************
  2. *    256色のPCX                        *
  3. *****************************************************************
  4.     .include    doscall.mac
  5.     .include    iocscall.mac
  6.     .include    myconst.h
  7.  
  8.     .xdef    _pcx8_prt
  9.     .xdef    _pcx8_scroll
  10.  
  11.     .xref    _Wait
  12.     .xref    _PageSync
  13.  
  14.     .xref    key_chk
  15.     .xref    tenkey_chk
  16.     .xref    cursor_chk
  17.     .xref    mouse_chk
  18.  
  19.     .xref    x_set
  20.     .xref    y_set
  21.     .xref    inf_change
  22.  
  23.     .xref    tate
  24.     .xref    yoko
  25.     .xref    x_max
  26.     .xref    y_max
  27.     .xref    x_pos
  28.     .xref    y_pos
  29.     .xref    gr_addr
  30.     .xref    fi_size
  31.     .xref    buff_addr
  32.     .xref    kflg
  33.  
  34.     .xref    esc_flg
  35.     .xref    next_flg
  36.     .xref    inkey_flg3
  37.     .xref    scroll_key
  38.     .xref    s_dot8
  39.  
  40.     .text
  41.     .even
  42.  
  43. *****************************************************************
  44. *    256色表示                        *
  45. *****************************************************************
  46. _pcx8_prt:
  47.     bsr    line_byte_set        *1ラインのバイト数を求める
  48.     bsr    front_line_set        *表側に表示する横ドット数を求める
  49.     bsr    back_line_set        *裏側に表示する横ドット数を求める
  50.     bsr    y_line_set        *表示する縦ドット数を求める
  51.     bsr    pcx8_prt        *表示
  52.     rts
  53.  
  54. *****************************************************************
  55. *    256色スクロール                        *
  56. *****************************************************************
  57. _pcx8_scroll:
  58.     bsr    scroll
  59.     rts
  60.  
  61. *****************************************************************
  62. *    1ラインのバイト数を求める                *
  63. *****************************************************************
  64. line_byte_set:
  65.     move.w    yoko(pc),d0
  66.     addq.w    #3,d0
  67.     andi.w    #$fffc,d0
  68.     move.w    d0,line_byte
  69.     rts
  70.  
  71. *****************************************************************
  72. *    表側に表示する横ドット数を求める            *
  73. *****************************************************************
  74. front_line_set:
  75.     move.w    x_pos(pc),d0
  76.     add.w    yoko(pc),d0
  77.     cmp.w    #512,d0
  78.     bhi    front_line1
  79.     move.w    yoko(pc),x_line
  80.     bra    front_line2
  81. front_line1:
  82.     move.w    #512,d0
  83.     sub.w    x_pos(pc),d0
  84.     move.w    d0,x_line
  85. front_line2:
  86.     rts
  87.  
  88. *****************************************************************
  89. *    裏側に表示する横ドット数を求める            *
  90. *****************************************************************
  91. back_line_set:
  92.     clr.w    x_line_bk
  93.     clr.w    x_sabun_bk
  94.     clr.w    x_pos_bk
  95.  
  96.     move.w    x_pos(pc),d0        *裏画面を表示するか
  97.     add.w    yoko(pc),d0        *page0の左半分(左256dot)に収まるとき
  98.     cmp.w    #256,d0            *裏画面は表示しない
  99.     bls    back_line4
  100.  
  101.     move.w    x_pos(pc),d0        *表画面は右半分(右256dot)から表示しているか
  102.     sub.w    #256,d0
  103.     bmi    back_line2        *違う
  104.  
  105. back_line1:                *表画面の右側から表示
  106.     move.w    d0,x_pos_bk
  107.     move.w    yoko(pc),d0
  108.     cmp.w    x_line(pc),d0
  109.     bhi    back_line1_
  110.     move.w    x_line(pc),x_line_bk
  111.     bra    back_line1__
  112. back_line1_:
  113.     move.w    yoko(pc),x_line_bk
  114. back_line1__:
  115. *    clr.w    x_sabun_bk
  116.     bra    back_line4
  117.  
  118. back_line2:                *表画面の左側から右側に表示
  119.     move.w    yoko(pc),d0
  120.     cmp.w    #768,d0
  121.     bls    back_line3
  122.     move.w    #768,d0
  123. back_line3:
  124.     move.w    #256,d1
  125.     sub.w    x_pos(pc),d1
  126.     move.w    d1,x_sabun_bk
  127.     sub.w    d1,d0
  128.     move.w    d0,x_line_bk
  129. *    clr.w    x_pos_bk
  130. back_line4:
  131.     rts
  132.  
  133. *****************************************************************
  134. *    縦方向の表示する長さを求める                *
  135. *****************************************************************
  136. y_line_set:
  137.     move.w    tate(pc),d0
  138.     cmp.w    #512,d0
  139.     bcs    y_line1
  140.     move.w    #512,d0
  141. y_line1:
  142.     move.w    d0,pcx_yd        *pcx_ydot数
  143.     move.w    d0,y_line
  144.     rts
  145.  
  146. *****************************************************************
  147. *    表示                            *
  148. *****************************************************************
  149. pcx8_prt:
  150.     tst.w    x_line_bk        *裏画面を表示するか
  151.     beq    pcx8_prt1        *しない
  152.  
  153.     move.w    x_pos_bk(pc),gram_x    *表示座標
  154.     move.w    y_pos(pc),gram_y
  155.  
  156.     move.w    x_sabun_bk(pc),pcx_x    *表示範囲(x,y)
  157.     clr.w    pcx_y
  158.     move.w    x_line_bk(pc),pcx_xd
  159.     move.w    y_line(pc),pcx_yd
  160.  
  161.     bsr    get_pcx_addr
  162.     bsr    get_gram_addr
  163.     adda.l    #$c80000,a2
  164.     bsr    pcx8_put
  165.  
  166. pcx8_prt1:
  167.     move.w    x_pos(pc),gram_x    *表示座標
  168.     move.w    y_pos(pc),gram_y
  169.     clr.w    pcx_x            *表示範囲(x,y)
  170.     clr.w    pcx_y
  171.     move.w    x_line(pc),pcx_xd
  172.     move.w    y_line(pc),pcx_yd
  173.  
  174.     bsr    get_pcx_addr
  175.     bsr    get_gram_addr
  176.     adda.l    #GRAM,a2
  177.     bsr    pcx8_put
  178.     rts
  179.  
  180. pcx8_put:
  181.     move.w    pcx_xd(pc),d0        *横ドット数
  182.  
  183.     moveq.l    #0,d3            *次のラインへのバイト数
  184.     move.w    line_byte(pc),d3    *(転送元)
  185.     sub.w    d0,d3
  186.  
  187.     move.l    #512,d5            *表示データの1ライン下までの差分
  188.     sub.w    d0,d5            *(表示先)
  189.     add.w    d5,d5
  190.  
  191.     addq.l    #1,a2            *転送先を奇数アドレスにする
  192.  
  193.     move.w    pcx_yd(pc),d7        *縦ループ数
  194.     subq.w    #1,d7            *dbraのため-1
  195.  
  196.     cmpi.b    #MC68060,MPUTYPE    *MC68060か
  197.     bcc    pcx8_put60
  198.  
  199.     cmpi.w    #4,d0            *転送横サイズが4未満か
  200.     bcs    pcx8_put60        *そう
  201.  
  202.     move.l    a1,d6            *転送もとが奇数アドレスか
  203.     btst.l    #0,d6
  204.     bne    pcx8_putk
  205.  
  206.     move.w    d0,d4
  207.     andi.w    #$fffC,d0
  208.     andi.w    #$0003,d4
  209.  
  210.     cmpi.b    #MC68030,MPUTYPE    *MC68030か
  211.     bcc    pcx8_put30
  212.  
  213. pcx8_put00:                *MC68000用
  214.     move.w    #1024,d5        *データの補正
  215.     adda.w    d0,a2
  216.     adda.w    d0,a2
  217.  
  218.     lea.l    pcx8_put02(pc),a3    *ジャンプアドレス計算
  219.     move.w    d0,d1
  220.     lsr.w    #1,d1
  221.     add.w    d0,d1
  222.     suba.w    d1,a3
  223.  
  224. pcx8_put01:
  225.     jmp    (a3)
  226.  
  227.     move.l    (a1)+,d6
  228.     movep.l    d6,-1024(a2)
  229.     move.l    (a1)+,d6
  230.     movep.l    d6,-1016(a2)
  231.     move.l    (a1)+,d6
  232.     movep.l    d6,-1008(a2)
  233.  
  234.     move.l    (a1)+,d6
  235.     movep.l    d6,-1000(a2)
  236.     move.l    (a1)+,d6
  237.     movep.l    d6,-992(a2)
  238.     move.l    (a1)+,d6
  239.     movep.l    d6,-984(a2)
  240.     move.l    (a1)+,d6
  241.     movep.l    d6,-976(a2)
  242.     move.l    (a1)+,d6
  243.     movep.l    d6,-968(a2)
  244.     move.l    (a1)+,d6
  245.     movep.l    d6,-960(a2)
  246.     move.l    (a1)+,d6
  247.     movep.l    d6,-952(a2)
  248.     move.l    (a1)+,d6
  249.     movep.l    d6,-944(a2)
  250.     move.l    (a1)+,d6
  251.     movep.l    d6,-936(a2)
  252.     move.l    (a1)+,d6
  253.     movep.l    d6,-928(a2)
  254.     move.l    (a1)+,d6
  255.     movep.l    d6,-920(a2)
  256.     move.l    (a1)+,d6
  257.     movep.l    d6,-912(a2)
  258.     move.l    (a1)+,d6
  259.     movep.l    d6,-904(a2)
  260.  
  261.     move.l    (a1)+,d6
  262.     movep.l    d6,-896(a2)
  263.     move.l    (a1)+,d6
  264.     movep.l    d6,-888(a2)
  265.     move.l    (a1)+,d6
  266.     movep.l    d6,-880(a2)
  267.     move.l    (a1)+,d6
  268.     movep.l    d6,-872(a2)
  269.     move.l    (a1)+,d6
  270.     movep.l    d6,-864(a2)
  271.     move.l    (a1)+,d6
  272.     movep.l    d6,-856(a2)
  273.     move.l    (a1)+,d6
  274.     movep.l    d6,-848(a2)
  275.     move.l    (a1)+,d6
  276.     movep.l    d6,-840(a2)
  277.     move.l    (a1)+,d6
  278.     movep.l    d6,-832(a2)
  279.     move.l    (a1)+,d6
  280.     movep.l    d6,-824(a2)
  281.     move.l    (a1)+,d6
  282.     movep.l    d6,-816(a2)
  283.     move.l    (a1)+,d6
  284.     movep.l    d6,-808(a2)
  285.  
  286.     move.l    (a1)+,d6
  287.     movep.l    d6,-800(a2)
  288.     move.l    (a1)+,d6
  289.     movep.l    d6,-792(a2)
  290.     move.l    (a1)+,d6
  291.     movep.l    d6,-784(a2)
  292.     move.l    (a1)+,d6
  293.     movep.l    d6,-776(a2)
  294.     move.l    (a1)+,d6
  295.     movep.l    d6,-768(a2)
  296.     move.l    (a1)+,d6
  297.     movep.l    d6,-760(a2)
  298.     move.l    (a1)+,d6
  299.     movep.l    d6,-752(a2)
  300.     move.l    (a1)+,d6
  301.     movep.l    d6,-744(a2)
  302.     move.l    (a1)+,d6
  303.     movep.l    d6,-736(a2)
  304.     move.l    (a1)+,d6
  305.     movep.l    d6,-728(a2)
  306.     move.l    (a1)+,d6
  307.     movep.l    d6,-720(a2)
  308.     move.l    (a1)+,d6
  309.     movep.l    d6,-712(a2)
  310.     move.l    (a1)+,d6
  311.     movep.l    d6,-704(a2)
  312.  
  313.     move.l    (a1)+,d6
  314.     movep.l    d6,-696(a2)
  315.     move.l    (a1)+,d6
  316.     movep.l    d6,-688(a2)
  317.     move.l    (a1)+,d6
  318.     movep.l    d6,-680(a2)
  319.     move.l    (a1)+,d6
  320.     movep.l    d6,-672(a2)
  321.     move.l    (a1)+,d6
  322.     movep.l    d6,-664(a2)
  323.     move.l    (a1)+,d6
  324.     movep.l    d6,-656(a2)
  325.     move.l    (a1)+,d6
  326.     movep.l    d6,-648(a2)
  327.     move.l    (a1)+,d6
  328.     movep.l    d6,-640(a2)
  329.     move.l    (a1)+,d6
  330.     movep.l    d6,-632(a2)
  331.     move.l    (a1)+,d6
  332.     movep.l    d6,-624(a2)
  333.     move.l    (a1)+,d6
  334.     movep.l    d6,-616(a2)
  335.     move.l    (a1)+,d6
  336.     movep.l    d6,-608(a2)
  337.  
  338.     move.l    (a1)+,d6
  339.     movep.l    d6,-600(a2)
  340.     move.l    (a1)+,d6
  341.     movep.l    d6,-592(a2)
  342.     move.l    (a1)+,d6
  343.     movep.l    d6,-584(a2)
  344.     move.l    (a1)+,d6
  345.     movep.l    d6,-576(a2)
  346.     move.l    (a1)+,d6
  347.     movep.l    d6,-568(a2)
  348.     move.l    (a1)+,d6
  349.     movep.l    d6,-560(a2)
  350.     move.l    (a1)+,d6
  351.     movep.l    d6,-552(a2)
  352.     move.l    (a1)+,d6
  353.     movep.l    d6,-544(a2)
  354.     move.l    (a1)+,d6
  355.     movep.l    d6,-536(a2)
  356.     move.l    (a1)+,d6
  357.     movep.l    d6,-528(a2)
  358.     move.l    (a1)+,d6
  359.     movep.l    d6,-520(a2)
  360.     move.l    (a1)+,d6
  361.     movep.l    d6,-512(a2)
  362.     move.l    (a1)+,d6
  363.     movep.l    d6,-504(a2)
  364.  
  365.     move.l    (a1)+,d6
  366.     movep.l    d6,-496(a2)
  367.     move.l    (a1)+,d6
  368.     movep.l    d6,-488(a2)
  369.     move.l    (a1)+,d6
  370.     movep.l    d6,-480(a2)
  371.     move.l    (a1)+,d6
  372.     movep.l    d6,-472(a2)
  373.     move.l    (a1)+,d6
  374.     movep.l    d6,-464(a2)
  375.     move.l    (a1)+,d6
  376.     movep.l    d6,-456(a2)
  377.     move.l    (a1)+,d6
  378.     movep.l    d6,-448(a2)
  379.     move.l    (a1)+,d6
  380.     movep.l    d6,-440(a2)
  381.     move.l    (a1)+,d6
  382.     movep.l    d6,-432(a2)
  383.     move.l    (a1)+,d6
  384.     movep.l    d6,-424(a2)
  385.     move.l    (a1)+,d6
  386.     movep.l    d6,-416(a2)
  387.     move.l    (a1)+,d6
  388.     movep.l    d6,-408(a2)
  389.  
  390.     move.l    (a1)+,d6
  391.     movep.l    d6,-400(a2)
  392.     move.l    (a1)+,d6
  393.     movep.l    d6,-392(a2)
  394.     move.l    (a1)+,d6
  395.     movep.l    d6,-384(a2)
  396.     move.l    (a1)+,d6
  397.     movep.l    d6,-376(a2)
  398.     move.l    (a1)+,d6
  399.     movep.l    d6,-368(a2)
  400.     move.l    (a1)+,d6
  401.     movep.l    d6,-360(a2)
  402.     move.l    (a1)+,d6
  403.     movep.l    d6,-352(a2)
  404.     move.l    (a1)+,d6
  405.     movep.l    d6,-344(a2)
  406.     move.l    (a1)+,d6
  407.     movep.l    d6,-336(a2)
  408.     move.l    (a1)+,d6
  409.     movep.l    d6,-328(a2)
  410.     move.l    (a1)+,d6
  411.     movep.l    d6,-320(a2)
  412.     move.l    (a1)+,d6
  413.     movep.l    d6,-312(a2)
  414.     move.l    (a1)+,d6
  415.     movep.l    d6,-304(a2)
  416.  
  417.     move.l    (a1)+,d6
  418.     movep.l    d6,-296(a2)
  419.     move.l    (a1)+,d6
  420.     movep.l    d6,-288(a2)
  421.     move.l    (a1)+,d6
  422.     movep.l    d6,-280(a2)
  423.     move.l    (a1)+,d6
  424.     movep.l    d6,-272(a2)
  425.     move.l    (a1)+,d6
  426.     movep.l    d6,-264(a2)
  427.     move.l    (a1)+,d6
  428.     movep.l    d6,-256(a2)
  429.     move.l    (a1)+,d6
  430.     movep.l    d6,-248(a2)
  431.     move.l    (a1)+,d6
  432.     movep.l    d6,-240(a2)
  433.     move.l    (a1)+,d6
  434.     movep.l    d6,-232(a2)
  435.     move.l    (a1)+,d6
  436.     movep.l    d6,-224(a2)
  437.     move.l    (a1)+,d6
  438.     movep.l    d6,-216(a2)
  439.     move.l    (a1)+,d6
  440.     movep.l    d6,-208(a2)
  441.  
  442.     move.l    (a1)+,d6
  443.     movep.l    d6,-200(a2)
  444.     move.l    (a1)+,d6
  445.     movep.l    d6,-192(a2)
  446.     move.l    (a1)+,d6
  447.     movep.l    d6,-184(a2)
  448.     move.l    (a1)+,d6
  449.     movep.l    d6,-176(a2)
  450.     move.l    (a1)+,d6
  451.     movep.l    d6,-168(a2)
  452.     move.l    (a1)+,d6
  453.     movep.l    d6,-160(a2)
  454.     move.l    (a1)+,d6
  455.     movep.l    d6,-152(a2)
  456.     move.l    (a1)+,d6
  457.     movep.l    d6,-144(a2)
  458.     move.l    (a1)+,d6
  459.     movep.l    d6,-136(a2)
  460.     move.l    (a1)+,d6
  461.     movep.l    d6,-128(a2)
  462.     move.l    (a1)+,d6
  463.     movep.l    d6,-120(a2)
  464.     move.l    (a1)+,d6
  465.     movep.l    d6,-112(a2)
  466.     move.l    (a1)+,d6
  467.     movep.l    d6,-104(a2)
  468.  
  469.     move.l    (a1)+,d6
  470.     movep.l    d6,-96(a2)
  471.     move.l    (a1)+,d6
  472.     movep.l    d6,-88(a2)
  473.     move.l    (a1)+,d6
  474.     movep.l    d6,-80(a2)
  475.     move.l    (a1)+,d6
  476.     movep.l    d6,-72(a2)
  477.     move.l    (a1)+,d6
  478.     movep.l    d6,-64(a2)
  479.     move.l    (a1)+,d6
  480.     movep.l    d6,-56(a2)
  481.     move.l    (a1)+,d6
  482.     movep.l    d6,-48(a2)
  483.     move.l    (a1)+,d6
  484.     movep.l    d6,-40(a2)
  485.     move.l    (a1)+,d6
  486.     movep.l    d6,-32(a2)
  487.     move.l    (a1)+,d6
  488.     movep.l    d6,-24(a2)
  489.     move.l    (a1)+,d6
  490.     movep.l    d6,-16(a2)
  491.     move.l    (a1)+,d6
  492.     movep.l    d6,-8(a2)
  493. pcx8_put02:
  494.  
  495.     move.w    d4,d1
  496.     beq    pcx8_put04
  497.     subq.w    #1,d1
  498.     moveq.l    #0,d0
  499. pcx8_put03:
  500.     move.b    (a1)+,(a2,d0.w)
  501.     addq.l    #2,d0
  502.     dbra.w    d1,pcx8_put03
  503. pcx8_put04:
  504.     adda.l    d3,a1            *変換元アドレス更新
  505.     adda.l    d5,a2            *表示先アドレス更新
  506.     dbra.w    d7,pcx8_put01
  507.     rts
  508.  
  509.  
  510. pcx8_put30:                *MC68030以上用(タブソ)
  511.     lsr.w    #2,d0            *1/4
  512.     subq.w    #1,d0
  513. pcx8_put31:
  514.     move.w    d0,d1
  515. pcx8_put32:
  516.     move.l    (a1)+,d6
  517.     movep.l    d6,(a2)
  518.     addq.l    #8,a2
  519.     dbra.w    d1,pcx8_put32
  520.  
  521.     move.w    d4,d1
  522.     beq    pcx8_put34
  523.     subq.w    #1,d1
  524. pcx8_put33:
  525.     move.b    (a1)+,(a2)
  526.     addq.l    #2,a2
  527.     dbra.w    d1,pcx8_put33
  528. pcx8_put34:
  529.     adda.l    d3,a1            *変換元アドレス更新
  530.     adda.l    d5,a2            *表示先アドレス更新
  531.     dbra.w    d7,pcx8_put31
  532.     rts
  533.  
  534.  
  535. pcx8_put60:                *MC68060以上用(タブソ)
  536.     subq.w    #1,d0            *転送横サイズが4未満の時
  537. pcx8_put61:
  538.     move.w    d0,d1
  539. pcx8_put62:
  540.     move.b    (a1)+,(a2)
  541.     addq.l    #2,a2
  542.     dbra.w    d1,pcx8_put62
  543.     adda.l    d3,a1            *変換元アドレス更新
  544.     adda.l    d5,a2            *表示先アドレス更新
  545.     dbra.w    d7,pcx8_put61
  546.     rts
  547.  
  548.  
  549. pcx8_putk:                *転送もとアドレスが奇数の時
  550.     cmpi.w    #5,d0            *転送横サイズが5未満か
  551.     bcs    pcx8_put60        *そう
  552.  
  553.     subq.w    #1,d0
  554.     move.w    d0,d4
  555.     andi.w    #$fffC,d0
  556.     andi.w    #$0003,d4
  557.  
  558.     lsr.w    #2,d0
  559.     subq.w    #1,d0
  560.  
  561. pcx8_putk1:
  562.     move.b    (a1)+,(a2)
  563.     addq.l    #2,a2
  564.     move.w    d0,d1
  565.  
  566. pcx8_putk2:
  567.     move.l    (a1)+,d6
  568.     movep.l    d6,(a2)
  569.     addq.l    #8,a2
  570.     dbra.w    d1,pcx8_putk2
  571.  
  572.     move.w    d4,d1
  573.     beq    pcx8_putk4
  574.     subq.w    #1,d1
  575. pcx8_putk3:
  576.     move.b    (a1)+,(a2)
  577.     addq.l    #2,a2
  578.     dbra.w    d1,pcx8_putk3
  579. pcx8_putk4:
  580.     adda.l    d3,a1            *変換元アドレス更新
  581.     adda.l    d5,a2            *表示先アドレス更新
  582.     dbra.w    d7,pcx8_putk1
  583.     rts
  584.  
  585. *****************************************************************
  586. *    スクロール制御                        *
  587. *****************************************************************
  588. scroll:
  589.     moveq.l    #0,d2            *スクロール座標初期化
  590.     moveq.l    #0,d3
  591.  
  592.     clr.w    x_old
  593.     clr.w    y_old
  594.  
  595.     bsr    down_demo
  596.     bsr    right_demo
  597.  
  598.     tst.b    kflg            *キー入力待ち
  599.     beq    scroll8            *指定無し
  600.  
  601. scroll2:
  602.     bsr    key_chk            *キー入力チェック
  603. *    bsr    mouse_chk        *マウスからの入力チェック
  604.  
  605.     tst.b    esc_flg            *エスケープ入力有るか
  606.     bne    scroll9            *指定有り
  607.     tst.b    next_flg        *ネクスト入力有るか
  608.     bne    scroll9            *指定有り
  609.  
  610.     bsr    wait_chk        *ウェイト値の変更チェック
  611.     bsr    cursor_chk        *カーソルキーからの入力チェック
  612.     bsr    tenkey_chk        *テンキー入力チェック
  613.     bsr    mouse_chk        *マウスからの入力チェック
  614.     bsr    _PageSync        *768x512 256色モード
  615.     bsr    go_scroll
  616.     bra    scroll2            *キー入力に戻る
  617.  
  618. scroll8:
  619.     bsr    key_chk            *ESCくらいは入力チェック
  620.     bsr    mouse_chk        *マウスからの入力チェック
  621.  
  622. scroll9:
  623.     rts
  624.  
  625. *****************************************************************
  626. *    下方向へ全画面スクロールを行う                *
  627. *****************************************************************
  628. down_demo:
  629.     tst.w    y_max
  630.     beq    down_demo9
  631.  
  632.     move.w    s_dot8(pc),-(sp)
  633.     lsr.w    s_dot8
  634. down_demo0:
  635.     bsr    key_chk
  636.     bsr    cursor_chk
  637.     bsr    tenkey_chk
  638.     bsr    mouse_chk
  639.     tst.b    scroll_key
  640.     bne    down_demo8
  641.     tst.b    esc_flg
  642.     bne    down_demo8
  643.     tst.b    next_flg
  644.     bne    down_demo8
  645.  
  646.     bsr    _PageSync        *768x512 256色モード
  647.     bsr    down
  648.     cmp.w    y_max(pc),d3
  649.     bne    down_demo0
  650. down_demo8:
  651.     move.w    (sp)+,s_dot8
  652. down_demo9:
  653.     rts
  654.  
  655. *****************************************************************
  656. *    右方向へ全画面スクロールを行う                *
  657. *****************************************************************
  658. right_demo:
  659.     tst.w    x_max
  660.     beq    right_demo9
  661.     tst.w    d3
  662.     bne    right_demo9
  663.  
  664. *    move.w    y_max(pc),d0
  665. *    cmp.w    x_max(pc),d0
  666. *    bhi    right_demo9
  667.     move.w    s_dot8(pc),-(sp)
  668.     lsr.w    s_dot8
  669. right_demo0:
  670.     bsr    key_chk
  671.     bsr    cursor_chk
  672.     bsr    tenkey_chk
  673.     bsr    mouse_chk
  674.     tst.b    scroll_key
  675.     bne    right_demo8
  676.     tst.b    esc_flg
  677.     bne    right_demo8
  678.     tst.b    next_flg
  679.     bne    right_demo8
  680.  
  681.     bsr    _PageSync        *768x512 256色モード
  682.     bsr    right
  683.     cmp.w    x_max(pc),d2
  684.     bne    right_demo0
  685. right_demo8:
  686.     move.w    (sp)+,s_dot8
  687. right_demo9:
  688.     rts
  689.  
  690. *****************************************************************
  691. *    ウェイト値の変更チェック                *
  692. *****************************************************************
  693. wait_chk:
  694.     movea.l    #$800,a0
  695.     btst.b    #2,8(a0)        *'-'が押されたか?
  696.     beq    wait_chk1
  697.  
  698.     tst.b    inkey_flg3
  699.     bne    wait_chk9
  700.  
  701.     st    inkey_flg3
  702.     sub.w    #1,_Wait
  703.     bpl    wait_chk9
  704.     clr.w    _Wait
  705.     bra    wait_chk9
  706.  
  707. wait_chk1:
  708.     btst.b    #6,8(a0)        *'+'
  709.     beq    wait_chk8
  710.  
  711.     tst.b    inkey_flg3
  712.     bne    wait_chk9
  713.  
  714.     st    inkey_flg3
  715.     add.w    #1,_Wait
  716.     cmp.w    #4096,_Wait
  717.     bls    wait_chk9
  718.     move.w    #4096,_Wait
  719.     bra    wait_chk9
  720.  
  721. wait_chk8:
  722.     sf    inkey_flg3
  723.  
  724. wait_chk9:
  725.     rts
  726.  
  727. *****************************************************************
  728. *    スクロール                        *
  729. *****************************************************************
  730. go_scroll:
  731.     moveq.l    #0,d0
  732.     move.b    scroll_key(pc),d0
  733.     add.w    d0,d0
  734.     add.w    d0,d0
  735.     movea.l    scroll_tbl(pc,d0.w),a0
  736.     jsr    (a0)
  737.     rts
  738.  
  739. scroll_tbl:
  740.     .dc.l    null            *0000    入力無し
  741.     .dc.l    left            *0001    左
  742.     .dc.l    up            *0010    上
  743.     .dc.l    left_up            *0011    上左
  744.     .dc.l    right            *0100    右
  745.     .dc.l    null            *0101    右左
  746.     .dc.l    right_up        *0110    右上
  747.     .dc.l    up            *0111    右上左
  748.     .dc.l    down            *1000    下
  749.     .dc.l    left_down        *1001    下左
  750.     .dc.l    null            *1010    下上
  751.     .dc.l    left            *1011    下上左
  752.     .dc.l    right_down        *1100    下右
  753.     .dc.l    down            *1101    下右左
  754.     .dc.l    right            *1110    下右上
  755.     .dc.l    null            *1111    下右上左
  756.     .even
  757.  
  758. *****************************************************************
  759. *    入力無し                        *
  760. *****************************************************************
  761. null:
  762.     rts
  763.  
  764. *****************************************************************
  765. *    右下(手抜き)                        *
  766. *****************************************************************
  767. right_down:
  768.     bsr    right
  769.     bsr    down
  770.     rts
  771.  
  772. *****************************************************************
  773. *    左下(手抜き)                        *
  774. *****************************************************************
  775. left_down:
  776.     bsr    left
  777.     bsr    down
  778.     rts
  779.  
  780. *****************************************************************
  781. *    右上(手抜き)                        *
  782. *****************************************************************
  783. right_up:
  784.     bsr    right
  785.     bsr    up
  786.     rts
  787.  
  788. *****************************************************************
  789. *    左上(手抜き)                        *
  790. *****************************************************************
  791. left_up:
  792.     bsr    left
  793.     bsr    up
  794.     rts
  795.  
  796. *****************************************************************
  797. *    左へ                            *
  798. *****************************************************************
  799. left:
  800.     sub.w    s_dot8(pc),d2
  801.     tst.w    d2
  802.     bpl    left1
  803.     clr.w    d2
  804. left1:
  805.     move.w    x_old(pc),d5        *何ドットずらすか
  806.     sub.w    d2,d5
  807.     beq    left9
  808.  
  809.     bsr    x_set
  810.  
  811.     move.w    d2,d0            *表示開始X座標
  812.     add.w    x_pos(pc),d0
  813.     and.w    #$1ff,d0
  814.     move.w    d0,gram_x
  815.  
  816.     move.w    y_old(pc),d0        *表示開始Y座標
  817.     add.w    y_pos(pc),d0
  818.     and.w    #$1ff,d0
  819.     move.w    d0,gram_y
  820.  
  821.     move.w    d2,pcx_x
  822.     move.w    d5,pcx_xd
  823.     move.w    y_old(pc),pcx_y
  824.     move.w    y_line(pc),pcx_yd
  825.  
  826.     bsr    get_pcx_addr
  827.  
  828.     bsr    get_gram_addr
  829.     adda.l    #GRAM,a2
  830.     movea.l    #$c80000,a5
  831.  
  832.     bsr    g8            *表の表示
  833.  
  834.     tst.w    x_line_bk        *裏を表示するか
  835.     beq    left8
  836.  
  837.     bsr    get_pcx_addr
  838.     adda.w    #256,a1
  839.  
  840.     bsr    get_gram_addr
  841.     adda.l    #$c80000,a2
  842.     movea.l    #$d00000,a5
  843.  
  844.     bsr    g8            *裏の表示
  845.  
  846. left8:
  847.     move.w    d2,x_old
  848. left9:
  849.     rts
  850.  
  851. *****************************************************************
  852. *    上へ                            *
  853. *****************************************************************
  854. up:
  855.     sub.w    s_dot8(pc),d3
  856.     tst.w    d3
  857.     bpl    up1
  858.     clr.w    d3
  859. up1:
  860.     move.w    y_old(pc),d6        *何ドットずらすか
  861.     sub.w    d3,d6
  862.     beq    up9
  863.  
  864.     move.w    x_old(pc),d0        *表示開始X座標
  865.     add.w    x_pos(pc),d0
  866.     and.w    #$1ff,d0
  867.     move.w    d0,gram_x
  868.  
  869.     move.w    d3,d0            *表示開始Y座標
  870.     add.w    y_pos(pc),d0
  871.     and.w    #$1ff,d0
  872.     move.w    d0,gram_y
  873.  
  874.     move.w    x_old(pc),pcx_x
  875.     move.w    x_line(pc),pcx_xd
  876.     move.w    d3,pcx_y
  877.     move.w    d6,pcx_yd
  878.  
  879.     bsr    get_pcx_addr
  880.  
  881.     bsr    get_gram_addr
  882.     adda.l    #GRAM,a2
  883.     movea.l    #$c80000,a5
  884.  
  885.     bsr    g8            *表の表示
  886.  
  887.     tst.w    x_line_bk        *裏を表示するか
  888.     beq    up8
  889.  
  890.     move.w    x_old(pc),d0        *表示開始X座標補正
  891.     add.w    x_pos_bk(pc),d0
  892.     and.w    #$1ff,d0
  893.     move.w    d0,gram_x
  894.     move.w    x_line_bk(pc),pcx_xd    *ドット数補正
  895.  
  896.     bsr    get_pcx_addr
  897.     adda.w    x_sabun_bk(pc),a1
  898.  
  899.     bsr    get_gram_addr
  900.     adda.l    #$c80000,a2
  901.     movea.l    #$d00000,a5
  902.  
  903.     bsr    g8            *裏の表示
  904.  
  905.     bsr    y_set
  906.  
  907. up8:
  908.     move.w    d3,y_old
  909. up9:
  910.     rts
  911.  
  912. *****************************************************************
  913. *    右へ                            *
  914. *****************************************************************
  915. right:
  916.     add.w    s_dot8(pc),d2
  917.     cmp.w    x_max(pc),d2
  918.     bls    right1
  919.     move.w    x_max(pc),d2
  920. right1:
  921.     move.w    d2,d5            *何ドットずらすか
  922.     sub.w    x_old(pc),d5
  923.     beq    right9
  924.  
  925.     bsr    x_set
  926.  
  927.     move.w    x_old(pc),d0        *表示開始X座標
  928.     add.w    x_pos(pc),d0
  929.     add.w    #512,d0
  930.     and.w    #$1ff,d0
  931.     move.w    d0,gram_x
  932.  
  933.     move.w    y_old(pc),d0        *表示開始Y座標
  934.     add.w    y_pos(pc),d0
  935.     and.w    #$1ff,d0
  936.     move.w    d0,gram_y
  937.  
  938.     move.w    x_old(pc),pcx_x
  939.     add.w    #512,pcx_x
  940.     move.w    d5,pcx_xd
  941.     move.w    y_old(pc),pcx_y
  942.     move.w    y_line(pc),pcx_yd
  943.  
  944.     bsr    get_pcx_addr
  945.  
  946.     bsr    get_gram_addr
  947.     adda.l    #GRAM,a2
  948.     movea.l    #$c80000,a5
  949.  
  950.     bsr    g8            *表の表示
  951.  
  952.     tst.w    x_line_bk        *裏を表示するか
  953.     beq    right8
  954.  
  955.     bsr    get_pcx_addr
  956.     adda.w    #256,a1
  957.  
  958.     bsr    get_gram_addr
  959.     adda.l    #$c80000,a2
  960.     movea.l    #$d00000,a5
  961.  
  962.     bsr    g8            *裏の表示
  963.  
  964. right8:
  965.     move.w    d2,x_old
  966. right9:
  967.     rts
  968.  
  969. *****************************************************************
  970. *    下へ                            *
  971. *****************************************************************
  972. down:
  973.     add.w    s_dot8(pc),d3
  974.     cmp.w    y_max(pc),d3
  975.     bls    down1
  976.     move.w    y_max(pc),d3
  977. down1:
  978.     bsr    y_set
  979.  
  980.     move.w    d3,d6            *何ドットずらすか
  981.     sub.w    y_old(pc),d6
  982.     beq    down9
  983.  
  984.     move.w    x_old(pc),d0        *表示開始X座標
  985.     add.w    x_pos(pc),d0
  986.     and.w    #$1ff,d0
  987.     move.w    d0,gram_x
  988.  
  989.     move.w    y_old(pc),d0        *表示開始Y座標
  990.     add.w    y_pos(pc),d0
  991.     and.w    #$1ff,d0
  992.     move.w    d0,gram_y
  993.  
  994.     move.w    x_old(pc),pcx_x
  995.     move.w    x_line(pc),pcx_xd
  996.     move.w    y_old(pc),pcx_y
  997.     add.w    #512,pcx_y
  998.     move.w    d6,pcx_yd
  999.  
  1000.     bsr    get_pcx_addr
  1001.  
  1002.     bsr    get_gram_addr
  1003.     adda.l    #GRAM,a2
  1004.     movea.l    #$c80000,a5
  1005.  
  1006.     bsr    g8            *表の表示
  1007.  
  1008.     tst.w    x_line_bk        *裏を表示するか
  1009.     beq    down8
  1010.  
  1011.     move.w    x_old(pc),d0        *表示開始X座標補正
  1012.     add.w    x_pos_bk(pc),d0
  1013.     and.w    #$1ff,d0
  1014.     move.w    d0,gram_x
  1015.     move.w    x_line_bk(pc),pcx_xd    *ドット数補正
  1016.  
  1017.     bsr    get_pcx_addr
  1018.     adda.w    x_sabun_bk(pc),a1
  1019.  
  1020.     bsr    get_gram_addr
  1021.     adda.l    #$c80000,a2
  1022.     movea.l    #$d00000,a5
  1023.  
  1024.     bsr    g8            *裏の表示
  1025.  
  1026. down8:
  1027.     move.w    d3,y_old
  1028. down9:
  1029.     rts
  1030.  
  1031. *****************************************************************
  1032. *    スクロール分のグラフィックを表示する            *
  1033. *    gram_x, gram_y  表示先座標(GRAM)            *
  1034. *    pcx_x,  pcx_y   表示元座標(PCX)                *
  1035. *    pcx_xd, pcx_yd  ドット数                *
  1036. *****************************************************************
  1037. g8:
  1038.     move.w    pcx_xd(pc),d0        *横ドット数
  1039.     move.w    pcx_yd(pc),d7        *縦ドット数
  1040.  
  1041.     movea.w    line_byte(pc),a3    *次のラインへのバイト数
  1042.     suba.w    d0,a3            *(転送元)
  1043.  
  1044.     movea.w    #512,a4            *表示データの1ライン下までの差分
  1045.     suba.w    d0,a4            *(表示先)
  1046.     adda.l    a4,a4
  1047.  
  1048.     move.w    gram_x(pc),d6        *左右2回に分けての表示か
  1049.     add.w    pcx_xd(pc),d6
  1050.     cmp.w    #512,d6
  1051.     bhi    g8_3            *そう
  1052.  
  1053.     cmpi.b    #MC68060,MPUTYPE    *MC68060か
  1054.     bcc    g8_60
  1055.  
  1056.     cmpi.w    #4,d0            *転送横サイズが4未満か
  1057.     bcs    g8_60
  1058.  
  1059.     move.l    a1,d6            *転送もとが奇数アドレスか
  1060.     btst.l    #0,d6
  1061.     bne    g8_k
  1062.  
  1063. g8_1:
  1064.     move.w    d0,d4
  1065.     andi.w    #$fffC,d0
  1066.     andi.w    #$0003,d4
  1067.  
  1068.     lsr.w    #2,d0
  1069.     subq.w    #1,d0            *dbraのため-1
  1070.     subq.w    #1,d7            *dbraのため-1
  1071.  
  1072.     addq.l    #1,a2            *転送先を奇数アドレスにする
  1073. g8_11:
  1074.     move.w    d0,d1
  1075. g8_12:
  1076.     move.l    (a1)+,d6
  1077.     movep.l    d6,(a2)
  1078.     addq.l    #8,a2
  1079.     dbra.w    d1,g8_12
  1080.  
  1081.     move.w    d4,d1
  1082.     beq    g8_14
  1083.     subq.w    #1,d1
  1084. g8_13:
  1085.     move.b    (a1)+,(a2)
  1086.     addq.l    #2,a2
  1087.     dbra.w    d1,g8_13
  1088. g8_14:
  1089.     adda.l    a3,a1            *変換元アドレス更新
  1090.     adda.l    a4,a2            *表示先アドレス更新
  1091.     cmpa.l    a5,a2
  1092.     bcs    g8_15
  1093.     suba.l    #$80000,a2
  1094. g8_15:
  1095.     dbra    d7,g8_11
  1096.     rts
  1097.  
  1098.  
  1099. g8_3:                    *左右2回に分けて表示
  1100.  
  1101.     add.l    #1024,a4        *1ライン下までの差分を補正
  1102.  
  1103.     move.w    #512,d0            *横ドット1
  1104.     sub.w    gram_x(pc),d0
  1105.     move.w    pcx_xd(pc),d6        *横ドット2
  1106.     sub.w    d0,d6
  1107.  
  1108.     subq.w    #1,d0
  1109.     subq.w    #1,d6
  1110.     subq.w    #1,d7
  1111.  
  1112.     addq.l    #1,a2            *転送先を奇数アドレスにする
  1113. g8_30:
  1114.     move.w    d0,d1            *右側
  1115. g8_31:
  1116.     move.b    (a1)+,(a2)
  1117.     addq.l    #2,a2
  1118.     dbra    d1,g8_31
  1119. g8_32:
  1120.     move.w    d6,d1            *左側
  1121.     lea.l    -1024(a2),a2
  1122. g8_33:
  1123.     move.b    (a1)+,(a2)
  1124.     addq.l    #2,a2
  1125.     dbra    d1,g8_33
  1126.  
  1127.     adda.l    a3,a1            *変換元アドレス更新
  1128.     adda.l    a4,a2            *表示先アドレス更新
  1129.     cmpa.l    a5,a2
  1130.     bcs    g8_34
  1131.     suba.l    #$80000,a2
  1132. g8_34:
  1133.     dbra    d7,g8_30
  1134.     rts
  1135.  
  1136.  
  1137. g8_k:
  1138.     cmpi.w    #5,d0            *転送横サイズが5以下か
  1139.     bls    g8_60            *そう
  1140.  
  1141.     subq.w    #1,d0
  1142.     move.w    d0,d4
  1143.     andi.w    #$fffC,d0
  1144.     andi.w    #$0003,d4
  1145.  
  1146.     lsr.w    #2,d0
  1147.     subq.w    #1,d0            *dbraのため-1
  1148.     subq.w    #1,d7            *dbraのため-1
  1149.  
  1150.     addq.l    #1,a2            *転送先を奇数アドレスにする
  1151. g8_k1:
  1152.     move.b    (a1)+,(a2)
  1153.     addq.l    #2,a2
  1154.     move.w    d0,d1
  1155. g8_k2:
  1156.     move.l    (a1)+,d6
  1157.     movep.l    d6,(a2)
  1158.     addq.l    #8,a2
  1159.     dbra.w    d1,g8_k2
  1160.  
  1161.     move.w    d4,d1
  1162.     beq    g8_k4
  1163.     subq.w    #1,d1
  1164. g8_k3:
  1165.     move.b    (a1)+,(a2)
  1166.     addq.l    #2,a2
  1167.     dbra.w    d1,g8_k3
  1168. g8_k4:
  1169.     adda.l    a3,a1            *変換元アドレス更新
  1170.     adda.l    a4,a2            *表示先アドレス更新
  1171.     cmpa.l    a5,a2
  1172.     bcs    g8_k5
  1173.     suba.l    #$80000,a2
  1174. g8_k5:
  1175.     dbra    d7,g8_k1
  1176.     rts
  1177.  
  1178.  
  1179. g8_60:
  1180.     subq.w    #1,d0            *dbraのため-1
  1181.     subq.w    #1,d7            *dbraのため-1
  1182.  
  1183.     addq.l    #1,a2            *転送先を奇数アドレスにする
  1184. g8_61:
  1185.     move.w    d0,d1
  1186. g8_62:
  1187.     move.b    (a1)+,(a2)
  1188.     addq.l    #2,a2
  1189.     dbra    d1,g8_62
  1190.  
  1191.     adda.l    a3,a1            *変換元アドレス更新
  1192.     adda.l    a4,a2            *表示先アドレス更新
  1193.     cmpa.l    a5,a2
  1194.     bcs    g8_63
  1195.     suba.l    #$80000,a2
  1196. g8_63:
  1197.     dbra    d7,g8_61
  1198.     rts
  1199.  
  1200. *****************************************************************
  1201. *    PCXデータのアドレスを取得                *
  1202. *****************************************************************
  1203. get_pcx_addr:
  1204.     move.w    pcx_y(pc),d0        *(pcx_y*line_byte)+pcx_x+gr_addr
  1205.     mulu    line_byte(pc),d0
  1206.     add.l    gr_addr(pc),d0
  1207.     movea.l    d0,a1
  1208.     adda.w    pcx_x(pc),a1
  1209.     rts
  1210.  
  1211. *****************************************************************
  1212. *    GRAMのアドレスを取得                    *
  1213. *****************************************************************
  1214. get_gram_addr:
  1215.     move.w    gram_x(pc),d0        *表示先画像アドレス
  1216.     move.w    gram_y(pc),d1        *gram_y*1024+gram_x*2
  1217.     swap.w    d1
  1218.     clr.w    d1
  1219.     ror.l    #6,d1
  1220.     add.w    d0,d0
  1221.     add.w    d0,d1
  1222.     movea.l    d1,a2
  1223.     rts
  1224.  
  1225. *****************************************************************
  1226. *    ワークエリア                        *
  1227. *****************************************************************
  1228.     .bss
  1229.     .even
  1230.  
  1231. gram_x    .ds.w    1            *表示する座標(GRAM)
  1232. gram_y    .ds.w    1
  1233.  
  1234. pcx_x    .ds.w    1            *表示する座標(BMP)
  1235. pcx_y    .ds.w    1
  1236. pcx_xd    .ds.w    1            *表示するドット数
  1237. pcx_yd    .ds.w    1
  1238.  
  1239. line_byte:
  1240.     .ds.w    1            *1ラインのバイト数
  1241. x_line:
  1242.     .ds.w    1            *表画面の横ドット数
  1243. y_line:
  1244.     .ds.w    1            *縦ドット数
  1245. x_line_bk:
  1246.     .ds.w    1            *裏画面の横ドット数
  1247. x_pos_bk:
  1248.     .ds.w    1            *裏画面の表示位置X
  1249. x_sabun_bk:
  1250.     .ds.w    1            *表画面と裏画面のX方向の差分
  1251. x_old:
  1252.     .ds.w    1            *前回のX座標
  1253. y_old:
  1254.     .ds.w    1            *前回のY座標
  1255.     .even
  1256.